<?php
/*
 * @Descripttion: 队列服务提供者驱动规范接口
 * @version: 
 * @Author: ewgof
 * @Date: 2021-04-27 14:15:00
 * @LastEditors: ewgof
 * @LastEditTime: 2022-12-03 22:12:55
 */

namespace queue\interfaces;

interface DriverInterface 
{
    /**
     * @name: 
     * @msg: 连接队列服务提供者，比如 redis、rabbitMQ 等等
     * @param {array} $config 队列任务提供者相关配置
     * @return {resource} 返回相关的连接资源句柄
     */
    public static function connect();

    /**
     * @name: 
     * @msg: 推送消息到队列服务提供者
     * @param {array} $handler 指明任务处理逻辑，该参数结构如下： ['class_name', 'method'],其中 class_name 表示类名（必须是包含命名空间的完整类名）， method 表示方法名
     * @param {array} $params 传递给方法的参数
     * @param {integer} $retry_times 队列任务执行错误重试次数，默认 0 ，无限重试
     * @param {string} $queue_name 队列名称
     * @param {array} $init_params 传递给方法的参数,如果不是静态方式访问，此参数将会传递到构造函数中，如果 $handler 中指定的 method 是一个静态方法时，此参数被忽略
     * @return {bool}
     */
    public static function push(array $handler, array $params, int $retry_times = 0, string $queue_name = '', array $init_params = []);


    /**
     * @name: 
     * @msg: 推送消息到队列服务提供者,推送到延时队列，如果使用 redis 作为队列服务提供者，则不支持延时队列
     * @param {array} $handler 指明任务处理逻辑，该参数结构如下： ['class_name', 'method'],其中 class_name 表示类名， method 表示方法名
     * @param {array} $params 传递给方法的参数
     * @param {integer} $retry_times 队列任务执行错误重试次数，默认 0 ，无限重试
     * @param {string} $queue_name 队列名称
     * @param {array} $init_params 传递给方法的参数,如果不是静态方式访问，此参数将会传递到构造函数中，如果 $handler 中指定的 method 是一个静态方法时，此参数被忽略
     * @param {integer} $delay 延时时间，单位 s
     * @return {bool}
     */
    public static function delayPush(array $handler, array $params, int $retry_times = 0, string $queue_name = '', array $init_params = [], int $delay = 10);

    /**
     * @name: 
     * @msg: 
     * @param {string} $queue_name 队列标识 / 队列名称
     * @param {array} $queue_msg_arr 消息体
     * @param {string} $result 处理结果，failed：失败；success：成功
     * @return {*}
     */
    public static function confirm(array $queue_msg_arr, string $result = 'success');


    /**
     * @name: 
     * @msg: 从队列服务提供者拿取消息
     * @param {string} $queue_name 队列名称,如果是获取多个队列的消息，名称放在数组内
     * @return {string} json string
     */
    public static function pull(string $queue_name, int $time_out = 0);

    /**
     * @name: 
     * @msg: 
     * @param {string} $queue_name 队列名称
     * @param {bool} $frozen 是否在队列里面还有消息的时候强制删除队列
     * @return {bool}
     */
    public static function delete(string $queue_name, bool $frozen = false);

    /**
     * @name: 
     * @msg: 获取每个队列消息数量
     * @return 
     */
    public static function info();
}